class MyMap {
  /* 实现构造函数 */
  constructor() {
    // 创建一个空对象用于存储key-value
    this.obj = {};
    this.size = 0;
  }

  set(key, value) {
    // 将入参的key-value挂载到this.obj身上
    this.obj[key] = value;

    // 更新一下this.size
    this.updateSize();
  }

  get(key) {
    return this.obj[key];
  }

  updateSize() {
    // 获取this.obj中的所有key形成的数组 查看其长度
    this.size = Object.keys(this.obj).length;
  }

  /* 删除一个key-value */
  delete(key) {
    // 从this.obj中删除一个key
    delete this.obj[key];

    // 更新一下this.size
    this.updateSize();
  }

  /* 清空所有key-value */
  clear() {
    this.obj = {};
    this.size = 0;
  }

  /* 判断key是否存在 */
  has(key) {
    /* 判断对象是否有自己的属性（从原型链中继承的不算） */
    return this.obj.hasOwnProperty(key);
  }

  /* 批处理之遍历 */
  forEach(handler) {
    /* 有几个key-value就把handler执行几次 */
    for (let key in this.obj) {
      // handler(this.obj[key], key, this);

      // 确保handler中的this依然为当前Map对象
      handler.apply(this,[this.obj[key], key, this]);
    }
  }

  /* 查看所有Key */
  keys() {
    return Object.keys(this.obj);
  }

  /* 查看所有value */
  values() {
    /* 将Key数组映射为value数组并返回 */
    return Object.keys(this.obj).map((key) => this.obj[key]);
  }

  /* 查看所有条目（entry/item） */
  entries() {
    /* 将Key数组映射为{key,value}数组并返回 */
    return Object.keys(this.obj).map(
      (key) => ({key,value:this.obj[key]})
    );
  }
  
}

~(function () {
  // 使用构造函数创建MyMap对象
  const map = new MyMap();

  /* 增加数据 */
  map.set("six", "陆小凤");
  map.set("seven", "洪七公");
  map.set("eight", "袁八爷");

  /* 修改与增加一样 */
  map.set("seven", "白景琦");

  /* 查询数据 */
  console.log(map.get("six"));
  console.log(map.get("seven"));
  console.log(map.get("eight"));

  /* 删除数据 */
  // map.delete("eight");
  // map.clear();

  /* 更多查询 */
  console.log(map.size);

  /* 查询有无键值 */
  console.log(map.has("seven"));
  console.log(map.has("nine"));
  console.log("----------");

  /* 遍历 */
  map.forEach((value, key, m) => console.log(key, value, m));

  /* 查询所有的键或值 */
  console.log(map.keys()); //MapIterator{"six","seven","eight"}
  console.log(map.values());
  console.log(map.entries());
  console.log("==========");

  /* 遍历迭代器（iterators） */
  for (let entry of map.entries()) {
    console.log(entry);
  }

})();
